class FVue {
    constructor(options) {
        this.$data = options.data //保存data数据
        this.observe(this.$data)
            // test
        new Wathcher();
        console.log("模拟编译数据", this.$data.test);
    }
    observe(value) {
        if (!value || typeof value !== "object") {
            return;
        }
        Object.keys(value).forEach(key => {
            this.defineReactive(value, key, value[key])
        })
    }
    defineReactive(obj, key, val) {
        this.observe(val)
            // 创建dep
            // console.log("fangfa")
        const dep = new Dep()
        Object.defineProperty(obj, key, {
            enumerable: true,
            configurable: true,
            get() {
                console.log(Dep.target)
                Dep.target && dep.addDep(Dep.target)
                    // console.log(dep.deps)
                return val
            },
            set(newValue) {
                if (newValue == val) {
                    return;
                }
                console.log("数据发生变化")
                val = newValue
            }
        })
    }
}

// 所有的依赖收集管理 依赖添加更新操作
class Dep {
    constructor() {
        this.deps = []
    }
    addDep(dep) {
            this.deps.push(dep)
        }
        // 通知所有的watcher做更新操作
    notify() {
        this.deps.forEach(dep => {
            dep.update()
        })
    }
}

class Wathcher {
    constructor() {
        // 将来new 一个监听器时，将Watcher 实例附加到dep.targe 上
        Dep.target = this;
        // console.log("watcher");
    }
    update() {
        console.log("视图更行了")
    }
}